package com.kotlin.flong.flow

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeoutOrNull

/**
 * @Author:liangjl
 * @Date: 2020/7/10-20:55
 * @Eamil:jilongliang@sina.com
 * @Description:
 * Flow 取消
 * 1、Flow 的取消实际上与协程的取消之间是一种协同的关系，对于Flow来说，它本身并没有引入任何新的取消点这样的概念
 * 它对于取消是完成透明的
 * 2、Flow的收集操作是可以取消的，前提是Flow在一个可取消的挂起函数（如：delay）中被挂起了，除此之外，我们无法
 * 通过其他方式来取消Flow的执行
 *
 */
private fun myMethod(): Flow<Int> = flow() {
    for (a in 1..4) {
        delay(100L)
        println("发射 $a")
        emit(a)
    }
}

fun main() = runBlocking {
    //withTimeoutOrNull是一个挂起函数
    withTimeoutOrNull(280) {
        myMethod().collect { println(it) }
    }

    println("finished ")

}




